因为最近手上有个小的需求,设计一个可缩放和可拖拽的树形结构,我便去研读了D3官网给的一个树形的例子。
布局(Layout)
原本我以为理解了基本的选择器、元素操作、Enter、Exit就能去看实例的代码了,后来发现我错了,所以这里需要理解一下D3中布局(Layout)的概念。布局是D3中一个十分重要的概念,从布局衍生出很多图表。例如:饼状图(pie)、力导向图(force),树状图(tree)等等,基本实现了很多开源的可视化工具提供的图表。但是它又和很多可视化工具(如Echarts)有很大的不同。
相对于其它工具来说,D3较底层一点,所以初学者可能会觉得有点困难,但是一旦理解了D3布局的思想,使用起来,会比其它工具更加得心应手。首先,我阐释下D3和大部分可视化工具数据到图表的流程:
- 大部分可视化工具:数据 => 封装好的绘图函数 => 图表
- D3:数据 => Layout => 绘图所需的数据 => 绘制图形 => 图表
可以看出,D3需要自己去绘制图形,但是可以通过布局函数获得绘图所需要的数据,坏处是对初学者是一个很大的考验,好处是它能帮助我们制作出更加精密的图形。
树状图
回归正题,如何设计一个树形结构,我将从D3官网提供的示例代码分析。
页面代码如下:
|
|
因为D3示例代码是同步的形式读出整个树形数据结构,我对其进行了改造,模拟异步数据(async_city.json)。
|
|
画布
|
|
获取异步数据
|
|
构造树
|
|
从上面的代码可以看出构造树的核心代码就是这个update函数,下面以注释的形式深入理解树形的构造。
|
|

